package gspushmq.v1.produce.job.sys;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import ggframework.mongodb.BasicDBObject;
import ggframework.mongodb.DBCollection;
import ggframework.mongodb.DBCursor;
import ggframework.mongodb.DBObject;
import gspushmq.model.DataBase;
import gspushmq.model.MessageType;
import gspushmq.model.UserType;
import gspushmq.util.GGLogger;
import gspushmq.util.MongoUtil;
import gspushmq.v1.produce.GGDataStorage;
import gspushmq.v1.produce.job.core.GGServiceJob;
import gspushmq.v1.save.SaveMassRecord;




public class GGMyStockTagsJob extends GGServiceJob{
	@Override
	protected String setJobName(Map<String, Object> params) {
		return "自选股标签变动";
	}

	@Override
	public void doServiceJob(Map<String, Object> args) {
		info();
	}
	
	public void info(){
		DBCollection collection =  MongoUtil.getGGStockCollection("gg_mystock_tags_1");
		DBObject query = new BasicDBObject();
		DBObject fields = new BasicDBObject();
		fields.put("_id", 0);
		fields.put("stock_code", 1); 					// 股票代码
		fields.put("stock_name", 1); 					// 股票名称
		fields.put("full_code", 1);						// 股票代码全称
		fields.put("industry_appraise", 1); 			// 行业超预期鉴定(上一季)
		fields.put("industry_appraise_newest", 1); 		// 行业超预期鉴定(最新季)
		fields.put("over_rate", 1); 					// 当季超额收益率
		fields.put("success_rate", 1); 					// 季度胜率 当季
		fields.put("hold_change", 1); 					// 主流机构持仓（十大流通股东基金持仓）
		fields.put("divergence", 1); 					// 分歧度 
		fields.put("AH_premium", 1); 					// AH股折溢价
		fields.put("grow", 1); 							// 成长空间
		fields.put("business", 1); 						// 商业模式
		fields.put("risk", 1); 							// 风险提示
		fields.put("financing_intensity_1", 1); 		// 融资强度
		fields.put("future_achievement_appraise", 1);	// 公司业绩预判未来
		fields.put("future_achievement_appraise_new", 1);	// 公司业绩预判未来
		fields.put("down_success_rate", 1); 			// 季度胜率 下季
		fields.put("connectivity", 1); 					// 互联互通（沪股通 深股通）
		fields.put("hold_count", 1); 					// 互联互通持仓量
		fields.put("hold_percent", 1); 					// 互联互通持仓占比
		fields.put("hold_count_comparison", 1); 		// 互联互通持仓量变化
		fields.put("hold_percent_comparison", 1);		// 互联互通持仓比率变化
		fields.put("connectivity_dispatch", 1); 		// 互联互通（调入调出）
		fields.put("financing_securities_loan", 1); 	// 融资融券余额
		fields.put("retained_profits", 1); 				// 一致预期eps
		fields.put("unex_peg", 1);						// 一致预期peg
		fields.put("zyyx_score", 1);					// 确定性评分			
		fields.put("tag_change_1", 1); 					// 铃铛提醒
		fields.put("securities_loan", 1);				// 融券余额
		fields.put("periodicity", 1); 					// 个股风格
		fields.put("industry_periodicity", 1); 			// 行业周期性
		fields.put("sw_second_name", 1);				// 所属行业名称
		fields.put("sw_second_code", 1);				// 所属行业代码
		fields.put("business_status_new", 1);			// 行业地位
		fields.put("events", 1);						// 大事件提醒
		fields.put("good_standard", 1);					// 好标的漏斗
		fields.put("achievement_seasonal", 1);			// 业绩季节性
		fields.put("industry_future", 1);				// 行业预判未来
		fields.put("history_achievement_appraise", 1); 	// 公司业绩鉴定 上一季  1：业绩超预期 2：业绩符合预期 0：业绩低于预期 null:未出报表
		fields.put("current_period_appraise", 1); 		// 公司业绩鉴定 最新季 1：业绩超预期 2：业绩符合预期 0：业绩低于预期 null:未出报表
		fields.put("new_period_appraise", 1);			// 业绩鉴定最新有鉴定结果
		fields.put("tags", 1);							// 最新公司荣誉
		fields.put("ten_hold_change", 1);				// 主流机构基金持仓较上期变化
		fields.put("fund_hold", 1); 					// 基金持仓
		fields.put("fund_hold_change", 1);				// 基金持仓较上期变化
		fields.put("ffa1_01", 1);						// 每股收益
		fields.put("ffa1_02", 1);						// 每股净资产
		fields.put("ffa1_03", 1);   					// 现金流
		fields.put("ffa1_19", 1);						// ROE
		fields.put("pe", 1);							// PE
		fields.put("pb", 1);							// PB	
		fields.put("ps", 1);							// PS
		fields.put("peg", 1);							// PEG
		fields.put("financing_intensity", 1);			
		fields.put("event_code", 1);			
		fields.put("event_name", 1);	
		DBCursor cursor = collection.find(query, fields);
		// 自选标签数据
		Map<String, Map<String, Object>> mystockTagsMap = new HashMap<String, Map<String, Object>>();
		// 自选标签对比数据
		List<Map<String, Object>> tagsData = new ArrayList<>();
		while (cursor.hasNext()) {
			DBObject o = cursor.next();
			String code = o.getString("stock_code");
			mystockTagsMap.put(code, o.toMap());
			tagsData.add(o.toMap());
			Set<String> keySet = o.keySet();
			Set<String> newSet = new HashSet<>();
			for(String s: keySet){
				Object obj = o.get(s);
				if(obj!= null){
					newSet.add(obj.toString());
				}
			}
		}
		cursor.close();
		
		MessageType messType = new MessageType();
		messType.setMq_type("sys");
		messType.setMq_sub_type("tags");
		messType.setUser_type(UserType.ALL);
		
		DataBase dataBase = GGDataStorage.BaseMap.get(messType);
		if (dataBase == null) {
			dataBase = new DataBase();
			GGDataStorage.BaseMap.put(messType, dataBase);
			dataBase.setMystockTagsMap(mystockTagsMap);
		} else {
			
			List<Map<String, Object>> tagsList = new ArrayList<>();
			
			Map<String, Map<String, Object>> lastMtMap = dataBase.getMystockTagsMap();
			if (mystockTagsMap != null && !mystockTagsMap.isEmpty()) {
				for (Entry<String, Map<String, Object>> entry : mystockTagsMap.entrySet()) {
					String code = entry.getKey();
					String fullCode = null;
					if (!code.startsWith("60")
							&& !code.startsWith("90")) {
						fullCode = "sz" + code;
					} else {
						fullCode = "sh" + code;
					}
					Map<String, Object> tMap = new HashMap<>();
					if (lastMtMap != null && lastMtMap.get(code) != null) {
						Map<String, Object> last = lastMtMap.get(code);
						Map<String, Object> thisDate = entry.getValue();
						for (Entry<String, Object> en : thisDate.entrySet()) {
							String key = en.getKey();
							if (en.getValue() == null) {
								continue;
							}
							if (last.get(key) == null || !(last.get(key)).equals(en.getValue())) {
								tMap.put(key, en.getValue());
							}
						}
					} else {
						tMap = entry.getValue();
					}
					if (!tMap.isEmpty()) {
						tMap.put("full_code", fullCode);
						tagsList.add(tMap);
						tMap = null;
					}
				}
			}
			
			GGLogger.info(SaveMassRecord.class, "tags 20190123 tagsList size " + tagsList.size());
			
			if (tagsList != null && !tagsList.isEmpty()) {
				
				//封装生产数据并写日志
				SaveMassRecord.handlerData(messType, tagsList, "自选股标签");
				dataBase.setMystockTagsMap(mystockTagsMap);
			}
		}
	}
}
